package cn.sys.dao;

import cn.sys.controller.dto.DormitoryInfoDTO;
import cn.sys.controller.dto.SearchDTO;
import cn.sys.entity.Dormitory;
import cn.sys.entity.DormitoryPosition;
import cn.sys.entity.MaintainDormitory;
import cn.sys.entity.ManagerInfo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 宿舍信息持久层处理接口
 */
public interface DormitoryDao {
    /**
     * 查询宿舍信息
     */
    DormitoryInfoDTO findDormitoryByStuId(@Param("stuId") int stuId);

    /**
     * 根据宿舍id查询当前宿舍的入住人数
     */
    int findDormitoryCountByDorId(@Param("dorId") int dorId);

    /**
     * 管理员对学员退寝办理，将其住宿状态值修改为1（已退寝），并记录退寝时间
     */
    int updateStuDormitoryState(@Param("stuId") int stuId, @Param("quitTime") Date quitTime);

    /**
     * 查询学生寝室表中是否存在学生信息，
     * 如果不存在或已经退寝返回为空，
     * 否则返回寝室id，方便查询寝室信息
     * 注意用integer接收，这样返回值为空不会报错
     */
    Integer findStuDormitoryByStuId(int stuId);

    /**
     * 修改寝室状态
     */
    int updateDormitoryState(@Param("dorId") int dorId, @Param("state") int state);

    /**
     * 统计宿舍信息-宿舍总间数、宿舍中床位数
     */
    List<Map<String, Object>> findDormitoryTotal();

    /**
     * 统计宿舍信息-已入住人数
     */
    Integer findDormitoryLivingCount();

    /**
     * 统计宿舍信息-已入住男生人数、已入住女生人数
     * 状态为1是男寝，2是女寝
     */
    Integer findDormitoryGenderCount(int state);

    /**
     * 统计宿舍信息-男寝总床位数1、修改状态可以得到女寝2，
     * 减去已入住人数可以得到剩余数目
     */
    Integer findDormitoryBedGenderCount(int state);

    /**
     * 统计宿舍信息-空寝总数目
     */
    Integer findEmptyDormitoryCount();

    /**
     * 统计宿舍信息-双人间空寝室数，修改type可以得到四、六
     */
    Integer findDormitoryTypeCount(int type);

    /**
     * 查询可选的寝室信息
     */
    List<Dormitory> findAllDormitoryChooseable(@Param("state") Integer state, @Param("dorPosId") Integer dorPosId);

    /**
     * 添加学生入住寝室
     */
    int addStuDormitory(@Param("dorId") Integer dorId, @Param("stuId") Integer stuId, @Param("state") int state,@Param("createTime") Date createTime);

    /**
     * 添加寝室信息
     */
    int addDormitory(Dormitory dormitory);

    /**
     * 增减宿舍的剩余床位数，i为数量，传入正数加，传入负数减
     */
    int updateDormitorySurplusNum(@Param("dorId") Integer dorId, @Param("i") int i);

    /**
     * 联合宿舍位置表和宿舍表查到所有宿舍有关信息
     */
    List<Map<String, Object>> findDormitoryAndPositions();

    /**
     * 根据宿舍id查询宿舍信息
     */
    Dormitory findDormitoryByDorId(Integer dorId);

    /**
     * 修改宿舍信息
     */
    int updateDormitoryInfo(Dormitory dormitory);

    /**
     * 查询所有的宿舍信息
     */
    List<Dormitory> findAllDormitory();

    /**
     * 根据条件查询寝室列表
     */
    List<Dormitory> findDormitoryListBySearch(SearchDTO searchDTO);

}
